#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    : /queue.py
@Time    : 2021-03-16 19:37:47
@Author  : Gray Snail
@Version : 1.0
@Contact : shtao2011@sina.com
@License : Copyright (c) 2021 Gray Snail
@Desc    : None
'''


import queue

# python 队列支持多线程

# 队列的创建、入队、出队
q = queue.Queue(3)
print(q.empty())

q.put(10)
q.put(1)

print(q.get())
print(q.full())
print(q.qsize())

# 阻塞队列

# 入队，并指定阻塞超时时间（队列满时会阻塞）
q.put(12, block=True, timeout=3)

# 出队，指定阻塞超时时间（队列空时会阻塞）
q.get(block=True, timeout=5)


# 非阻塞的封装
q.put_nowait(11)
q.get_nowait()

# 意味着之前入队的一个任务已经完成。由队列的消费者线程调用。
# 每一个get()调用得到一个任务，接下来的task_done()调用告诉队列该任务已经处理完毕。
q.task_done()

# 如果当前一个join()正在阻塞，它将在队列中的所有任务都处理完时恢复执行
# （即每一个由put()调用入队的任务都有一个对应的task_done()调用）。

# 上述代码执行后，队列中还有（11）一个元素，但只调用了一次 task_done，所以join后会一直阻塞
# 要想结束等待，必须所有元素出队，且入队的每一个元素都调用一次task_done

q.get()
q.task_done()
q.task_done()
q.task_done()

q.join()
